package tinf.izvoriste;

import java.util.Random;

import tinf.ispis.IspisUDatoteku;

/**
 * Izvorište s određenim vjerojatnostima pojavljivanja pojedinih simbola.<br>
 * p(a) = 4/10<br>
 * p(b) = 1/10<br>
 * p(c) = 1/10<br>
 * p(d) = 2/10<br>
 * p(e) = 2/10<br>
 * 
 * @author Dado
 */
public class Izvoriste {

	private Character[] simboli = { 'a', 'b', 'c', 'd', 'e' };
	private int[] vjerojatnostPojavljivanja = { 4, 1, 1, 2, 2 };
	private int[] brojPojavljivanja = { 0, 0, 0, 0, 0 };
	private Character[] poljeSimbola;
	private Random rand;
	
	

	public int[] getBrojPojavljivanja() {
		return brojPojavljivanja;
	}

	public Izvoriste() {
		poljeSimbola = new Character[10];
		this.popuniPoljeSimbola();
	}

	/**
	 * Nasumično popunjava polje simbola
	 */
	private void popuniPoljeSimbola() {

		rand = new Random();
		for (int i = 0; i < 10; i++) {
			int indexSimbola = rand.nextInt(5);
			while (vjerojatnostPojavljivanja[indexSimbola] == 0) {
				indexSimbola = (indexSimbola + 1) % 5;
			}
			poljeSimbola[i] = simboli[indexSimbola];
			vjerojatnostPojavljivanja[indexSimbola]--;
		}

		IspisUDatoteku.upisiUDatoteku("Izvoriste");
		IspisUDatoteku.upisiUDatoteku("---------");
		String ispis = "Polje simbola: [ ";
		for (Character a : poljeSimbola) {
			ispis += a + " ";
		}
		ispis += "]";
		IspisUDatoteku.upisiUDatoteku(ispis);
	}

	/**
	 * Generira poruku zadane duljine
	 * 
	 * @param duljina
	 *            tražena duljina poruke
	 */
	public String generirajPoruku(int duljina) {

		StringBuilder build = new StringBuilder();
		char simbol;

		rand = new Random();

		for (int i = 0; i < duljina; i++) {
			simbol = poljeSimbola[rand.nextInt(10)];
			build.append(simbol);
			povecajBrojPojavljivanja(simbol);
		}
		// dodaj oznaku kraja niza
		build.append('*');

		IspisUDatoteku.upisiUDatoteku("Generirana poruka duljine " + duljina
				+ " simbola: " + build.toString());
		IspisUDatoteku.upisiUDatoteku("Broj pojavljivanja simbola:");
		String ispis = "";
		for (int i = 0; i < simboli.length; i++) {
			ispis += simboli[i] + ": " + brojPojavljivanja[i] + "  ";
		}
		IspisUDatoteku.upisiUDatoteku(ispis);
		IspisUDatoteku
				.upisiUDatoteku("========================================================================================================================\n");

		return build.toString();
	}

	/**
	 * Povećava broj pojavljivanja simbola
	 */
	private void povecajBrojPojavljivanja(char simbol) {

		switch (simbol) {
		case 'a':
			brojPojavljivanja[0]++;
			break;
		case 'b':
			brojPojavljivanja[1]++;
			break;
		case 'c':
			brojPojavljivanja[2]++;
			break;
		case 'd':
			brojPojavljivanja[3]++;
			break;
		case 'e':
			brojPojavljivanja[4]++;
		}

	}

}
